#!/usr/bin/env python
# coding: utf-8

# In[2]:


import pandas as pd

# 读取数据
data = pd.read_excel('股票客户流失.xlsx')

# 检查缺失值
print(data.isnull().sum())


# In[3]:


import seaborn as sns
import matplotlib.pyplot as plt

# 查看数据基本统计信息
data.describe()

# 绘制变量分布
plt.figure(figsize=(12, 6))
sns.histplot(data['账户资金（元）'], kde=True)
plt.title('账户资金分布')
plt.xlabel('账户资金（元）')
plt.ylabel('频数')
plt.show()

plt.figure(figsize=(12, 6))
sns.histplot(data['最后一次交易距今时间（天）'], kde=True)
plt.title('最后一次交易距今时间分布')
plt.xlabel('最后一次交易距今时间（天）')
plt.ylabel('频数')
plt.show()

# 计算相关性矩阵并绘制热力图
corr = data.corr()
plt.figure(figsize=(10, 8))
sns.heatmap(corr, annot=True, cmap='coolwarm')
plt.title('变量相关性热力图')
plt.show()


# In[6]:


from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix, roc_curve, auc

# 特征选择
X = data[['账户资金（元）', '最后一次交易距今时间（天）', '上月交易佣金（元）', '累计交易佣金（元）', '本券商使用时长（年）']]
y = data['是否流失']

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 初始化逻辑回归模型并训练
model = LogisticRegression()
model.fit(X_train, y_train)

# 进行预测
y_pred = model.predict(X_test)


# In[7]:


# 计算混淆矩阵
conf_matrix = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(8, 6))
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='YlGnBu',
            xticklabels=['预测未流失', '预测流失'], yticklabels=['实际未流失', '实际流失'])
plt.title('混淆矩阵')
plt.xlabel('预测值')
plt.ylabel('真实值')
plt.show()

# 计算ROC曲线和AUC值
fpr, tpr, thresholds = roc_curve(y_test, model.predict_proba(X_test)[:, 1])
roc_auc = auc(fpr, tpr)

plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], 'k--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic')
plt.legend(loc="lower right")
plt.show()


# In[ ]:




